package controller

import (
	"os"
	"path/filepath"
	"time"

	"github.com/gofiber/fiber/v2"
	"github.com/gofiber/fiber/v2/log"
)

const basePath = "C:/Users/KONODIODA/Desktop/limsPj/repository/2010.12/101205S2/101205S2001J1/"

func StaticFile(c *fiber.Ctx) error {
	tmpLink := c.Query("path")
	if tmpLink == "" {
		return c.Status(fiber.StatusBadRequest).SendString("Missing file parameter")
	}

	// 检查符号链接是否存在
	if _, err := os.Stat(tmpLink); os.IsNotExist(err) {
		return c.Status(fiber.StatusNotFound).SendString("Symbolic link does not exist")
	}

	// 解析符号链接到目标路径
	resolvedPath, err := filepath.EvalSymlinks(tmpLink)
	if err != nil {
		return c.Status(fiber.StatusInternalServerError).SendString("Failed to resolve symbolic link")
	}

	log.Infof("Resolved path: %s", resolvedPath)
	// 通过解析后的路径访问文件
	return c.SendFile(resolvedPath)
}

func GetSymbolicLink(c *fiber.Ctx) error {
	filePath := c.Query("file")
	if filePath == "" {
		return c.Status(fiber.StatusBadRequest).SendString("Missing file parameter")
	}

	// 生成临时符号链接路径
	tmpLink := filepath.Join(os.TempDir(), "symlink_"+time.Now().Format("20060102150405"))
	targetPath := basePath + filePath
	log.Infof("Creating symlink for target path: %s", targetPath)

	// 创建符号链接

	/**
	oldname 是目标路径，可以是绝对路径或相对路径，但必须指向一个真实的文件或目录。
	newname 是符号链接的路径，可以是虚拟的，但它的父目录必须存在。
	*/

	err := os.Symlink(targetPath, tmpLink)
	if err != nil {
		log.Error("Failed to create symlink:", err)
		return c.Status(fiber.StatusInternalServerError).SendString("Failed to create symlink")
	}

	// 定时删除符号链接（例如10分钟后）
	go func(link string) {
		time.Sleep(10 * time.Hour)
		os.Remove(link)
	}(tmpLink)

	return c.JSON(fiber.Map{
		"symlink": tmpLink,
		"expire":  time.Now().Add(10 * time.Minute).Format(time.RFC3339),
	})
}
